home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / cchasm.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  4KB  |  160 lines

  1. /*
  2.  * Cosmic Chasm video hardware emulation
  3.  *
  4.  * Jul 15 1999 by Mathis Rosenhauer
  5.  *
  6.  */
  7.  
  8. #include "driver.h"
  9. #include "vidhrdw/vector.h"
  10.  
  11. #define HALT   0
  12. #define JUMP   1
  13. #define COLOR  2
  14. #define SCALEY 3
  15. #define POSY   4
  16. #define SCALEX 5
  17. #define POSX   6
  18. #define LENGTH 7
  19.  
  20. #define VEC_SHIFT 16
  21.  
  22. UINT8 *cchasm_ram;
  23.  
  24. static int xcenter, ycenter;
  25.  
  26. static void cchasm_refresh_end (int dummy)
  27. {
  28.     cpu_set_irq_line (0, 2, ASSERT_LINE);
  29. }
  30.  
  31. static void cchasm_refresh (void)
  32. {
  33.  
  34.     int pc = 0;
  35.     int done = 0;
  36.     int opcode, data;
  37.     int currentx = 0, currenty = 0;
  38.     int scalex = 0, scaley = 0;
  39.     int color = 0;
  40.     int total_length = 1;   /* length of all lines drawn in a frame */
  41.     int move = 0;
  42.  
  43.     vector_clear_list();
  44.  
  45.     while (!done)
  46.     {
  47.  
  48.         data = READ_WORD (&cchasm_ram[pc]);
  49.            opcode = data >> 12;
  50.         data &= 0xfff;
  51.         if ((opcode > COLOR) && (data & 0x800))
  52.           data |= 0xfffff000;
  53.  
  54.         pc += 2;
  55.  
  56.         switch (opcode)
  57.         {
  58.         case HALT:
  59.             done=1;
  60.             break;
  61.         case JUMP:
  62.             pc = data - 0xb00;
  63.             logerror("JUMP to %x\n", data);
  64.             break;
  65.         case COLOR:
  66.             data = data ^ 0xfff;
  67.             color = ((data >> 4) & 0xe0) | ((data >> 3 ) &0x1c) | ((data >> 2 ) &0x3);
  68.             break;
  69.         case SCALEY:
  70.             scaley = data << 5;
  71.             break;
  72.         case POSY:
  73.             move = 1;
  74.             currenty = ycenter + (data << 16);
  75.             break;
  76.         case SCALEX:
  77.             scalex = data << 5;
  78.             break;
  79.         case POSX:
  80.             move = 1;
  81.             currentx = xcenter - (data << 16);
  82.             break;
  83.         case LENGTH:
  84.             if (move)
  85.             {
  86.                 vector_add_point (currentx, currenty, 0, 0);
  87.                 move = 0;
  88.             }
  89.  
  90.             currentx -= data * scalex;
  91.             currenty += data * scaley;
  92.  
  93.             total_length += abs(data);
  94.  
  95.             if (color)
  96.                 vector_add_point (currentx, currenty, color, 0xff);
  97.             else
  98.                 move = 1;
  99.             break;
  100.         default:
  101.             logerror("Unknown refresh proc opcode %x with data %x at pc = %x\n", opcode, data, pc-2);
  102.             done = 1;
  103.             break;
  104.         }
  105.     }
  106.     /* Refresh processor runs with 6 MHz */
  107.     timer_set (TIME_IN_NSEC(166) * total_length, 0, cchasm_refresh_end);
  108. }
  109.  
  110.  
  111. WRITE_HANDLER( cchasm_refresh_control_w )
  112. {
  113.     switch (data)
  114.     {
  115.     case 0x37ff:
  116.         cchasm_refresh();
  117.         break;
  118.     case 0xf7ff:
  119.         cpu_set_irq_line (0, 2, CLEAR_LINE);
  120.         break;
  121.     }
  122. }
  123.  
  124. void cchasm_init_colors (unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom)
  125. {
  126.     int i= 0, r, g, b;
  127.  
  128.     for (r=0; r<8; r++)
  129.         for (g=0; g<8; g++)
  130.             for (b=0; b<4; b++)
  131.             {
  132.                 palette[3*i  ] = (255 * r) / 7;
  133.                 palette[3*i+1] = (255 * g) / 7;
  134.                 palette[3*i+2] = (255 * b) /3;
  135.                 i++;
  136.             }
  137. }
  138.  
  139. int cchasm_vh_start (void)
  140. {
  141.     int xmin, xmax, ymin, ymax;
  142.  
  143.     xmin=Machine->drv->visible_area.min_x;
  144.     ymin=Machine->drv->visible_area.min_y;
  145.     xmax=Machine->drv->visible_area.max_x;
  146.     ymax=Machine->drv->visible_area.max_y;
  147.  
  148.     xcenter=((xmax+xmin)/2) << VEC_SHIFT;
  149.     ycenter=((ymax+ymin)/2) << VEC_SHIFT;
  150.  
  151.     vector_set_shift (VEC_SHIFT);
  152.     return vector_vh_start();
  153. }
  154.  
  155.  
  156. void cchasm_vh_stop (void)
  157. {
  158.     vector_vh_stop();
  159. }
  160.